import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * 计算各职位的平均薪资，以表格形式展示每个职位及其平均薪资，结果保留两位小数
 */
public class SalaryAver {

    public static TreeMap<String, Double> salaryAver(List<Map<String, Object>> a) {
        //创建两个新的集合用来装部门的人数和部门的薪资
        TreeMap<String, BigDecimal> salaryAllMap = new TreeMap<>();//薪资总数
        TreeMap<String, Integer> salaryNumMap = new TreeMap<>();//部门人数
        //遍历传进的员工集合，找出其中key为salary和job两个的values
        for (Map<String, Object> map : a) {
            String salary = map.get("salary").toString();
            String job = map.get("job").toString();
            //new一个BigDecimal，用以计算部门的平均薪资
            BigDecimal decimal = new BigDecimal(salary);
            //判断上面创建两个集合是否含有这个key-->job
            if (salaryAllMap.containsKey(job)) {
                //利用TreeMap的key的唯一性，累加部门薪资
                salaryAllMap.put(job, salaryAllMap.get(job).add(decimal));
            } else {
                //刚开始判断时，为空数组，肯定走else，先给空数组添加key和values，后面继续遍历就会走if
                salaryAllMap.put(job, decimal);
            }
            if (salaryNumMap.containsKey(job)) {
                salaryNumMap.put(job, salaryNumMap.get(job) + 1);
            } else {
                salaryNumMap.put(job, 1);
            }
        }
        // 定义返回列表
        TreeMap<String, Double> resultMap = new TreeMap<>();
        // 遍历salaryAllMap中的key
        for (String job : salaryAllMap.keySet()) {
            // 获取该职位的总工资
            BigDecimal sum = salaryAllMap.get(job);
            // 获取该职位的人数
            int count = salaryNumMap.get(job);

            // 计算平均薪资并保留两位小数
            BigDecimal average = sum.divide(
                    new BigDecimal(count),
                    2,
                    BigDecimal.ROUND_HALF_UP
            );
            resultMap.put(job, average.doubleValue());
        }
        return resultMap;
    }
}
